import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'dart:developer' as developer;
import 'dart:io';
import 'package:get_storage/get_storage.dart';

import '../../../common/routers/names.dart';
import '../../../common/values/constants.dart';
import '../../../common/services/user_service.dart';
import '../../../common/services/rongcloud_service.dart';
import 'index.dart';

class SplashController extends GetxController {
  // GetStorage实例
  final _storage = GetStorage();

  SplashController() {
    developer.log('SplashController constructor');
  }

  final state = SplashState();
  bool dialogShown = false;

  // 检查用户登录状态
  void _checkUserLoginStatus() {
    try {
      final userService = UserService.to;
      developer.log('检查用户登录状态: isLoggedIn=${userService.isLoggedIn}');
      
      if (userService.isLoggedIn && userService.currentUser != null) {
        // 用户已登录，显示用户信息并跳转到主页
        developer.log('✅ 用户已登录');
        developer.log('   用户信息: ${userService.getUserInfoString()}');
        navigateToMainPage();
      } else {
        // 用户未登录，跳转到登录页面
        developer.log('❌ 用户未登录，跳转到登录页面');
        navigateToLoginPage();
      }
    } catch (e) {
      developer.log('检查用户登录状态异常: $e');
      // 出现异常时跳转到登录页面
      navigateToLoginPage();
    }
  }

  // 跳转到主页面
  void navigateToMainPage() async {
    developer.log('导航到主页面');
    try {
      // 保存用户已同意隐私政策状态
      savePrivacyAgreedStatus(true);
      
      // 🔥 自动登录时也需要连接融云（解决关键问题）
      developer.log('🔐 自动登录用户，开始连接融云服务...');
      await _connectRongCloudForAutoLogin();
      
      developer.log('准备跳转到主页面: ${RouteNames.systemMain}');
      Get.offAllNamed(RouteNames.systemMain);
      developer.log('主页面跳转命令已执行');
    } catch (e) {
      developer.log('导航到主页面异常: $e');
    }
  }

  /// 自动登录时连接融云（参考MyApplication2的connectIM方法）
  Future<void> _connectRongCloudForAutoLogin() async {
    try {
      final userService = UserService.to;
      
      // 检查用户登录状态和融云Token
      if (!userService.isLoggedIn) {
        developer.log('❌ 用户未登录，跳过融云连接');
        return;
      }
      
      final rongCloudToken = userService.rongCloudToken;
      if (rongCloudToken?.isEmpty != false) {
        developer.log('❌ 融云Token为空，跳过融云连接');
        return;
      }
      
      developer.log('✅ 用户已登录，融云Token存在，开始连接...');
      developer.log('   用户ID: ${userService.userId}');
      developer.log('   融云用户ID: ${userService.rongCloudUserId}');
      if (rongCloudToken?.isNotEmpty == true) {
        final tokenPreview = rongCloudToken!.length > 20 
            ? rongCloudToken.substring(0, 20) 
            : rongCloudToken;
        developer.log('   Token: $tokenPreview...');
      }
      
      // 🔥 使用统一的connectIM方法（参考MyApplication2架构）
      final rongCloudService = RongCloudService.to;
      final success = await rongCloudService.connectIM();
      
      if (success) {
        developer.log('✅ 自动登录用户融云连接成功');
        
        // 🔥 设置全局状态监听器（参考MyApplication2的setIMStatusListener）
        rongCloudService.setIMStatusListener();
        
        // 🔥 接收离线消息（参考MyApplication2的receiveLogOutMessage）
        rongCloudService.receiveLogOutMessage();
        
      } else {
        developer.log('❌ 自动登录用户融云连接失败');
      }
      
    } catch (e) {
      developer.log('💥 自动登录融云连接异常: $e');
    }
  }

  // 跳转到登录页面
  void navigateToLoginPage() {
    developer.log('导航到登录页面');
    try {
      // 保存用户已同意隐私政策状态
      savePrivacyAgreedStatus(true);
      developer.log('准备跳转到登录页面: ${RouteNames.systemLogin}');
      Get.offAllNamed(RouteNames.systemLogin);
      developer.log('登录页面跳转命令已执行');
    } catch (e) {
      developer.log('导航到登录页面异常: $e');
    }
  }

  // 保存隐私政策同意状态
  void savePrivacyAgreedStatus(bool agreed) {
    try {
      developer.log('保存隐私政策同意状态: $agreed');
      _storage.write(Constants.storagePrivacyAgreedKey, agreed);
      // 如果是第一次启动，保存标记
      if (_storage.read<bool>(Constants.storageFirstLaunchKey) == null) {
        _storage.write(Constants.storageFirstLaunchKey, false);
      }
      developer.log('隐私政策状态保存成功');
    } catch (e) {
      developer.log('保存隐私政策状态异常: $e');
    }
  }

  // 检查用户是否已同意隐私政策
  bool hasUserAgreedPrivacy() {
    try {
      final bool? agreed = _storage.read<bool>(Constants.storagePrivacyAgreedKey);
      developer.log('用户是否已同意隐私政策: $agreed');
      return agreed == true;
    } catch (e) {
      developer.log('读取隐私政策状态异常: $e');
      return false; // 异常时默认为未同意
    }
  }

  // 检查是否是首次启动
  bool isFirstLaunch() {
    try {
      final bool? firstLaunch = _storage.read<bool>(
        Constants.storageFirstLaunchKey,
      );
      developer.log('是否是首次启动: ${firstLaunch == null}');
      return firstLaunch == null;
    } catch (e) {
      developer.log('检查首次启动状态异常: $e');
      return true; // 异常时默认为首次启动
    }
  }

  // 显示用户手册
  void showUserManual() {
    Get.back();
    dialogShown = false; // 重置标志，允许再次显示弹窗

    // 导航到统一的协议页面，传递类型参数
    Get.toNamed(
      RouteNames.systemAgreementPrivacyPolicy,
      arguments: {'type': 'userManual'},
    )?.then((_) {
      // 返回后重新显示弹窗
      showAgreementDialog();
    });
  }

  // 显示隐私政策
  void showPrivacyPolicy() {
    Get.back();
    dialogShown = false; // 重置标志，允许再次显示弹窗

    // 导航到统一的协议页面，传递类型参数
    Get.toNamed(
      RouteNames.systemAgreementPrivacyPolicy,
      arguments: {'type': 'privacyPolicy'},
    )?.then((_) {
      // 返回后重新显示弹窗
      showAgreementDialog();
    });
  }

  // 强制退出应用
  void exitApp() {
    developer.log('强制退出应用');
    exit(0);
  }

  // 显示用户手册和隐私政策弹窗
  void showAgreementDialog() {
    if (dialogShown) {
      developer.log('弹窗已显示，跳过重复显示');
      return; // 防止重复显示
    }
    dialogShown = true;

    developer.log('开始显示协议弹窗');
    developer.log('当前Context状态: ${Get.context != null}');
    developer.log('当前Route状态: ${Get.currentRoute}');

    try {
      // 使用简化的对话框布局，避免复杂的嵌套布局
      Get.dialog(
        AlertDialog(
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(20),
          ),
          backgroundColor: Colors.white,
          elevation: 5,
          titlePadding: const EdgeInsets.only(top: 20, bottom: 0),
          title: const Text(
            '用户手册和隐私政策',
            textAlign: TextAlign.center,
            style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
          ),
          contentPadding: const EdgeInsets.fromLTRB(24, 10, 24, 10),
          content: Container(
            width: double.maxFinite,
            child: RichText(
              textAlign: TextAlign.left,
              text: TextSpan(
                style: const TextStyle(
                  fontSize: 13,
                  color: Colors.black87,
                  height: 1.5,
                ),
                children: [
                  const TextSpan(
                    text:
                        '请您务必仔细阅读完充分理解服务协议和隐私政策各条款，包括但不限于为了向您提供即时通讯、内容等服务，我们需要收集您的设备信息和个人信息。您可阅读',
                  ),
                  WidgetSpan(
                    alignment: PlaceholderAlignment.middle,
                    child: GestureDetector(
                      onTap: showUserManual,
                      child: const Text(
                        '《用户手册》',
                        style: TextStyle(
                          fontSize: 14,
                          color: Colors.pinkAccent,
                          fontWeight: FontWeight.bold,
                        ),
                      ),
                    ),
                  ),
                  const TextSpan(text: '和'),
                  WidgetSpan(
                    alignment: PlaceholderAlignment.middle,
                    child: GestureDetector(
                      onTap: showPrivacyPolicy,
                      child: const Text(
                        '《隐私政策》',
                        style: TextStyle(
                          fontSize: 14,
                          color: Colors.pinkAccent,
                          fontWeight: FontWeight.bold,
                        ),
                      ),
                    ),
                  ),
                  const TextSpan(text: '了解详细信息，如您同意，请点击同意接受我们的服务。'),
                ],
              ),
            ),
          ),
          actionsAlignment: MainAxisAlignment.spaceEvenly,
          actionsPadding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
          buttonPadding: EdgeInsets.zero,
          actions: [
            Container(
              width: 120,
              height: 40,
              child: TextButton(
                onPressed: () {
                  // 直接退出应用
                  exitApp();
                },
                style: TextButton.styleFrom(
                  backgroundColor: Colors.grey.shade200,
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(25),
                  ),
                ),
                child: const Text(
                  '不同意',
                  style: TextStyle(color: Colors.black87, fontSize: 16),
                ),
              ),
            ),
            Container(
              width: 120,
              height: 40,
              child: TextButton(
                onPressed: () {
                  Get.back(); // 关闭弹窗
                  // 同意隐私协议后，检查用户登录状态
                  _checkUserLoginStatus();
                },
                style: TextButton.styleFrom(
                  backgroundColor: Colors.red.shade500,
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(25),
                  ),
                ),
                child: const Text(
                  '同意',
                  style: TextStyle(color: Colors.white, fontSize: 16),
                ),
              ),
            ),
          ],
        ),
        barrierDismissible: false, // 点击外部不能关闭
      );
      developer.log('协议弹窗显示成功');
    } catch (e) {
      developer.log('显示弹窗出错: $e');
      dialogShown = false; // 重置标志，允许重试
    }
  }

  @override
  void onInit() {
    super.onInit();
    developer.log('SplashController onInit');
  }

  @override
  void onReady() {
    super.onReady();
    developer.log('SplashController onReady');

    // 无论是否已同意协议，都先显示5秒闪屏页
    WidgetsBinding.instance.addPostFrameCallback((_) {
      // 延迟1秒后再检查用户协议状态
      Future.delayed(const Duration(seconds: 1), () {
        developer.log('闪屏页显示5秒后检查用户协议状态');
        
        // 检查用户是否已经同意隐私政策
        if (hasUserAgreedPrivacy()) {
          // 如果已同意隐私政策，再检查用户登录状态
          developer.log('用户已同意隐私政策，检查登录状态');
          _checkUserLoginStatus();
        } else {
          // 如果未同意，显示协议弹窗
          developer.log('用户未同意隐私政策，显示协议弹窗');
          // 确保在主线程上运行，并增加额外延迟确保UI完全加载
          Future.delayed(const Duration(milliseconds: 500), () {
            if (Get.context != null) {
              developer.log('准备显示协议弹窗...');
              showAgreementDialog();
            } else {
              developer.log('Get.context为空，无法显示弹窗');
            }
          });
        }
      });
    });
  }

  @override
  void onClose() {
    developer.log('SplashController onClose');
    try {
      // 取消所有可能的异步操作和定时器
      dialogShown = false;
      super.onClose();
    } catch (e) {
      developer.log('SplashController onClose异常: $e');
      super.onClose();
    }
  }
}
